﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PhraseCorrector.SpellLook
{
    public class SuggestItem : IComparable<SuggestItem>
    {
        // ////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///建议的正确拼写的单词。
        ///</summary>
        /// <remarks>
        /// 建议的拼写可能与输入词不相同。
        /// </remarks>
        public string term { set; get; }= "";
        
        // ////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 搜索词与建议之间的编辑距离。
        /// </summary>
        public int distance { set; get; }= 0;

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 建议词在字典中的频率（衡量词的常见程度）。
        /// </summary>
        public long count { set; get; }= 0;

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 建议词与原词的相似度。
        /// </summary>
        public double score { set; get; }= 0;

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>创建一个新的 SuggestItem 实例。</summary>
        /// <param name="term">建议的单词。</param>
        /// <param name="distance">与搜索词的编辑距离。</param>
        /// <param name="count">在字典中的频率。</param>
        public SuggestItem()
        {
            // 默认构造函数，可以在此处添加初始化逻辑（如果需要）。
        }
        
        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 构造一个新的 SuggestItem 对象，指定术语、距离和计数。
        /// </summary>
        /// <param name="term">搜索术语</param>
        /// <param name="distance">Levenshtein 距离</param>
        /// <param name="count">频率计数</param>
        public SuggestItem(string term, int distance, long count, double core)
        {
            this.term= term; // 分配搜索术语
            this.distance= distance; // 分配 Levenshtein 距离
            this.count= count; // 分配频率计数
            this.score= core;
        }
        
        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 将当前实例与另一个 SuggestItem 进行比较以进行排序。
        /// 返回一个整数，指示两个 SuggestItem 的相对顺序。
        /// </summary>
        /// <param name="other">要比较的另一个 SuggestItem</param>
        /// <returns>指示相对顺序的整数</returns>
        public int CompareTo(SuggestItem other)
        {
            // 按距离升序排序，然后按频率计数降序排序
            if (distance== other?.distance) return other.count.CompareTo(count);
            return distance.CompareTo(other?.distance);
        }
        
        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 确定当前实例是否等于另一个对象。
        /// 如果对象相等则返回 true，否则返回 false。
        /// </summary>
        /// <param name="obj">要比较的另一个对象</param>
        /// <returns>如果对象相等则返回 true，否则返回 false</returns>
        public override bool Equals(object obj)
        {
            // 检查比较的对象是否为 null 或不是相同的类型
            if (obj== null || GetType() != obj.GetType()) return false;
            // 比较 term 属性是否相等
            return Equals(term, ((SuggestItem)obj).term);
        }
        
        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 返回当前实例的哈希码。
        /// 哈希码基于 term 属性生成。
        /// </summary>
        /// <returns>当前实例的哈希码</returns>
        public override int GetHashCode()
        {
            return term.GetHashCode();
        }
        
        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 返回当前实例的字符串表示形式。
        /// 格式为 {term, distance, count}。
        /// </summary>
        /// <returns>当前实例的字符串表示形式</returns>
        public override string ToString()
        {
            return "{ 结果词汇: " + term + ", 编辑距离: " + distance + ", 频率: " + count +", 相似度: " + score.ToString("f2") + "}";
        }
        
        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 创建当前实例的浅拷贝。
        /// 返回一个新的 SuggestItem，它是当前实例的拷贝。
        /// </summary>
        /// <returns>当前实例的浅拷贝</returns>
        public SuggestItem ShallowCopy()
        {
            return (SuggestItem)MemberwiseClone();
        }
    }
}
